<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		//reduce() 方法对累加器和数组中的每个元素（从左到右）应用一个函数，将其减少为单个值。
		//数组里所有值的和
		var arr =[2, 1, 2, 3];
		var sum = arr.reduce(function (a, b) {
		  return a + b;
		},0);
		console.log(sum);
		console.log(arr);
		
		//参数1:callback
			/*
			 为数组中每个元素执行的函数，该函数接收三个参数：
				accumulator(当前值):累加器累加回调的返回值; 它是上一次调用回调时返回的累积值
				currentValue:数组中正在处理的元素。
				currentIndex可选:数组中正在处理的当前元素的索引。 如果提供了initialValue，则索引号为0，否则为索引为1。
				array可选：调用reduce的数组。
			*/
		//参数2:initialValue
			/*
			    用作第一个调用 callback的第一个参数的值。 如果没有提供初始值，则将使用数组中的第一个元素。
			    在没有初始值的空数组上调用 reduce 将报错。
			*/
		
		//返回值：  一个新的通过测试的元素的集合的数组
		
		//是否影响老数组：不影响
		
		//Polyfill:衬垫代码
		if (!Array.prototype.reduce) {
		  Object.defineProperty(Array.prototype, 'reduce', {
		    value: function(callback /*, initialValue*/) {
		      if (this === null) {
		        throw new TypeError( 'Array.prototype.reduce ' + 
		          'called on null or undefined' );
		      }
		      if (typeof callback !== 'function') {
		        throw new TypeError( callback +
		          ' is not a function');
		      }
		      var o = Object(this);
		      var len = o.length >>> 0; 
		      var k = 0; 
		      var value;
		      if (arguments.length >= 2) {
		        value = arguments[1];
		      } else {
		        while (k < len && !(k in o)) {
		          k++; 
		        }
		        if (k >= len) {
		          throw new TypeError( 'Reduce of empty array ' +
		            'with no initial value' );
		        }
		        value = o[k++];
		      }
		      while (k < len) {
		        if (k in o) {
		          value = callback(value, o[k], k, o);
		        }
		        k++;
		      }
		      return value;
		    }
		  });
		}
	</script>
</html>
